import NProgress from 'nprogress'
import useRsaStore from "@/store/modules/RsaStore.js"
import {getRsaPublicKeyAPI} from "@/api/rsa.js";
import useAccountStore from "@/store/modules/AccountStore.js";
import {ERROR_ROUTE} from "@/router/routes/error/error.js";
import {LOGIN_BY_MAIL_ROUTE, LOGIN_BY_PWD_ROUTE, LOGIN_ROUTE} from "@/router/routes/login/login.js";
import {loginEffectiveAPI} from "@/api/login.js";
import {addLoading_waveLoadingText, removeLoading_waveLoadingText} from "@/utils/loading.js";

// 无需获取 rsa 公钥即可访问的页面
const notNeedRsaRoutes = [ERROR_ROUTE]

// ************************
// * 全局路由前置守卫处理函数 *
// ************************
export async function beforeEachHandler(to, from, next) {
    // addLoading_waveLoadingText(document.body)
    // 开启进度条
    NProgress.start()
    // 无需 rsa 公钥即可访问的页面
    if (notNeedRsaRoutes.includes(to.name)) {
        next()
        return
    }
    // RSA store
    const rsaStore = useRsaStore()
    // rsa 公钥
    const rsaPublicKey = rsaStore.publicKey
    // 没有获取 rsa 公钥，先进行获取
    if (rsaPublicKey === null || rsaPublicKey === undefined || rsaPublicKey.length <= 0) {
        const res = await getRsaPublicKeyAPI()
        // 发生错误
        if (!res) {
            next({name: ERROR_ROUTE})
            return
        }
    }
    // 执行路由全局前置守卫逻辑处理
    const res = await handleBeforeEach(to, from, next)
    if (res) {
        // 可以前往要前往的页面
        next()
    }
}

// ************************
// * 全局路由前置守卫处理函数 *
// ************************
export function afterEachHandler(to, from) {
    // removeLoading_waveLoadingText(document.body)
    // 结束加载条
    NProgress.done()
}

// *******************
// * 不需要进行登录路由 *
// *******************
const notNeedLoginRoutes = [
    ...notNeedRsaRoutes,
    LOGIN_ROUTE,
    LOGIN_BY_MAIL_ROUTE,
    LOGIN_BY_PWD_ROUTE,
]

// ***************************
// * 执行前置守卫中执行的逻辑处理 *
// ***************************
async function handleBeforeEach(to, from, next) {
    // 要前往的页面的路由 name
    const toRouteName = to.name
    // 访问的路由不需要登录
    if (notNeedLoginRoutes.includes(toRouteName)) {
        return true
    }
    const accountStore = useAccountStore()
    // account
    const account = accountStore.account
    // 未登录过
    if (account === null || account === undefined || account.length <= 0) {
        // 前往登录
        next({name: LOGIN_BY_MAIL_ROUTE, query: {toRouteName}})
        return false
    }
    // 登录过，校验登录是否还有效
    let res = await loginEffectiveAPI()
    // 登录无效，前往登录
    if (!res) {
        next({name: LOGIN_BY_MAIL_ROUTE, query: {toRouteName}})
        return false
    }
    return true
}